DataSet是
ADO.NET的中心概念。可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合。
简介
DataSet 是 ADO. NET结构的主要组件,它是从
数据源中检索到的数据在内存中的缓存。DataSet 由一组 DataTable 对象组成,可使这些对象与 DataRelation 对象互相关联。还可通过使用 UniqueConstraint 和 ForeignKeyConstraint 对象在 DataSet 中实施
数据完整性。
正是由于DataSet才使得程序员在编程时可以屏蔽数据库之间的差异,从而获得一致的编程模型。DataSet支持多表、表间关系、数据约束等,和关系数据库的模型基本一致。
ado.net DataSet 的设计已明确指出它可独立于任何资料来源外而存取资料。因此,它可与多个不同的资料里来源搭配使用、与 XML 资料搭配使用,或用于
管理应用程序的本机资料。DataSet 包含一或多个由资料列和资料行所组成的
DataTable物件集合,以及 DataTable 物件中的主索引键、外部索引键、条件约束 (Constraint) 及资料的相关资讯。
尽管 DataTable 对象中包含数据,但是 DataRelationCollection 允许遍览表的层次结构。这些表包含在通过 Tables 属性访问的 DataTableCollection 中。当访问 DataTable 对象时,请注意它们是按条件区分大小写的。
例如,如果一个 DataTable 被命名为“mydatatable”,另一个被命名为“Mydatatable”,则用于搜索其中一个表的字符串被认为是区分大小写的。但是,如果“mydatatable”存在而“Mydatatable”不存在,则认为该搜索字符串不区分大小写。
DataSet 可将数据和架构作为 XML 文档进行读写。数据和架构可通过 HTTP 传输,并在支持 XML 的任何平台上被任何应用程序使用。可使用 WriteXmlSchema 方法将架构保存为 XML 架构,并且可以使用 WriteXml 方法保存架构和数据。若要读取既包含架构也包含数据的 XML 文档,可使用 ReadXml 方法。
在典型的多层实现中,用于创建和刷新 DataSet 并依次更新原始数据的步骤包括:
通过 DataAdapter 使用
数据源中的数据生成和填充 DataSet 中的每个 DataTable。
通过添加、更新或删除 DataRow 对象更改单个 DataTable 对象中的数据。
调用 GetChanges 方法以创建只反映对数据进行的更改的第二个 DataSet。
调用 DataAdapter 的 Update 方法,并将第二个 DataSet 作为
参数传递。
调用 Merge 方法将第二个 DataSet 中的更改合并到第一个中。
针对 DataSet 调用 AcceptChanges。或者,调用 RejectChanges 以取消更改。
需要注意的是:dataset所有数据都加载在内存上执行的,可以提高数据访问速度,提高硬盘数据的安全性。极大的改善了程序运行的速度和稳定性。
数据模型
因为DataSet可以看做是内存中的数据库,也因此可以说DataSet是数据表的集合,它可以包含任意多个数据表(DataTable),而且每一 DataSet中的数据表(DataTable)对应一个数据源中的数据表(Table)或是
数据视图(View)。数据表实质是由行(DataRow)和 列(
DataColumn)组成的集合为了保护内存中数据记录的正确性,避免并发访问时的读写冲突,DataSet对象中的DataTable负责维护每一条记录,分别保存记录的初始状态和当前状态。从这里可以看出DataSet是与只能存放单张数据表的Recordset是截然不同的概念。
DataSet对象结构还是非常复杂的,在DataSet对象的下一层中是DataTableCollection对象、 DataRelationCollection对象和ExtendedProperties对象。上文已经说过,每一个DataSet对象是由若干个 DataTable对象组成。DataTableCollection就是管理DataSet中的所有DataTable对象。表示DataSet中两个 DataTable对象之间的父/子关系是DataRelation对象。它使一个DataTable 中的行与另一个DataTable中的行相关联。这种关联类似于关系数据库中数据表之间的主键列和
外键列之间的关联。 DataRelationCollection对象就是管理DataSet中所有DataTable之间的DataRelation关系的。在 DataSet中DataSet、DataTable和
DataColumn都具有ExtendedProperties属性。 ExtendedProperties其实是一个属性集(PropertyCollection),用以存放各种自定义数据,如生成数据集的SELECT 语句等。DataRow表示DataType中实际的数据,我们通过DataRow将数据添加到用DataColumn定义好的DataTable。
三大特性
DataSet对象的三大特性包括:
(1) 独立性。DataSet独立于各种数据源。
(2) 离线(断开)和连接。
(3) DataSet对象是一个可以用XML形式表示的
数据视图,是一种数据关系视图。
特点介绍:
1、处理脱机数据,在多层应用程序中很有用。
2、可以在任何时候查看DataSet中任意行的内容,允许修改查询结果的方法。
3、处理分级数据
4、缓存更改
5、
XML的完整性: DataSet对象和
XML文档几乎是可互换的。
使用方法
在实际应用中,DataSet使用方法一般有三种:
(1) 把数据库中的数据通过
DataAdapter对象填充DataSet。
(2) 通过DataAdapter对象操作DataSet实现更新数据库。
(3) 把XML数据流或文本加载到DataSet。
属性
CaseSensitive
用于控制DataTable中的字符串比较是否区分大小写。
DataSetName
DesignMode
如果在设计时使用组件中的DataSet, DesignMode 返回True,否则返回False。
HasErrors
表示DataSet 中的DataRow对象是否包含错误。如果将一批更改提交给数据库并将DataAdapter对象的ContinueUpdateOnError 属性设置为True,则在提交更改后必须检查DataSet的HasErrors属性,以确定是否有更新失败。
NameSpace和Prefix
指定XML命名空间和前缀。
Relations
返回一个DataRelationCollection对象。
Tables
检查现有的DataTable对象。通过索引访问DataTable 有更好的性能。
方法
ejectChanges
接受或放弃DataSet中所有挂起更改。调用AcceptChanges时,RowState属性值为Added或Modified的所有行的RowState属性都将被设置为UnChanged。任何标记为Deleted的DataRow对象将从DataSet中删除。调用RejectChanges时,任何标记为Added的DataRow对象将会被从DataSet中删除,其他修改过的DatRow对象将返回前一状态。
Clear
清除DataSet中所有DataRow对象。该方法比释放-一个DataSet然后再创建--个相同结构的新DataSet要快。
Clone和Copy
使用Copy方法会创建与原DataSet具有相同结构和相同行的新DataSet。 使用Clone方法会创建具有相同结构的新DataSet,但不包含任何行。
GetChanges
返回与原DataSet对象具有相同结构的新DataSet,并且还包含原DataSet中所有挂起更改的行。
GetXml和GetXmlSchema
使用GetXml方法得到由DataSet的内容与她的架构信息转换为XML格式后的字符串。如果只希望返回架构信息,可以使用GetXmlSchema。
HasChange
表示DataSet中是否包含挂起更改的DataRow对象。
Merge
从另一个DataSet、DataTable 或现有DataSet中的-组DataRow对象载入数据。
ReadXml和WriteXml
使用ReadXml方法从文件、TextReader、数据流或者XmlReader中将XML数据载入DataSet中。
Reset
将DataSet返回为未初始化状态。如果想放弃现有DataSet并且开始处理新的DataSet, 使用Reset方法比创建一个DataSet的新实例好。
事件
MergeFailed:在DataSet的Merge方法发生一个异常时触发。
参考资料
ADO+ .NET tutorial - developer Fusion.